~今天要分享的是「模型參數挑選」~
我們在製作機器學習模型時,並不是只有選取合適的方法這麼簡單,還要調整模型的參數讓模型的結果最佳化,這就是模型參數挑選的重要性。
參數又分為模型參數與超參數,這兩者的區別在於模型參數是可以經由觀察資料直接估計的值,可以由數據自行調整,像是權重就是一種模型參數;而超參數則是不易透過觀察資料直接估計,需要自己手動設定和調整,像是學習率就是一種超參數。
想要找到合適的超參數可以透過使用網格搜尋與交叉驗證的方式達成。
程式碼如下,以尋找隨機森林的最佳超參數為例:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
# 創建一個 RandomForestClassifier 模型
model = RandomForestClassifier()
# 設定超參數的範圍
param_grid = {
'n_estimators': [5, 8, 10],
'max_depth': [3, 5, 8, 10]
}
# 使用 GridSearchCV 進行網格搜尋,cv用於設定交叉驗證的次數
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5)
# 輸入訓練資料進行搜尋
grid_search.fit(X_train, y_train)
# 印出最佳超參數
print("Best Parameters: ", grid_search.best_params_)
# 印出最佳模型
best_model = grid_search.best_estimator_
print("Best Model: ", best_model)
# 使用最佳模型進行預測
y_pred = best_model.predict(X_test)
from sklearn.model_selection import KFold
kf = KFold(n_splits=k, shuffle=True, random_state=42) #k為k摺交叉驗證的k
for i, (train_index, test_index) in enumerate(kf.split(X)): #X為欲分析資料的自變數
print(f"Fold {i}:")
print(f" Train: index={train_index}")
print(f" Test: index={test_index}")
留一法(Leave-One-Out)也是一種交叉驗證方法,與k-fold不同的是,留一法就像它本身的名字一樣,每次只會留下一個樣本做驗證集,其他樣本都會做訓練集,所以總共會重複N(樣本數)次。